<?php
namespace User\Model;

use Think\Model;

class UserModel extends Model{
    
    //自动验证
    protected $_validate = array(
        //  用户名验证
        array('username', '2,16', -1, self::EXISTS_VALIDATE, 'length'),             //用户名长度检查
        array('username', 'checkUserName', -2, self::EXISTS_VALIDATE, 'callback'),  //格式检查
        array('username', '', -3, self::EXISTS_VALIDATE, 'unique'),                 //是否已存在
        //  密码验证
        array('password', '6,30', -4, self::EXISTS_VALIDATE, 'length'),             //密码长度检查
        //  电话号码
        array('mobile', '11', -5, self::EXISTS_VALIDATE, 'length'),                 //电话号码长度验证
        array('mobile', 'checkMobile', -6, self::EXISTS_VALIDATE, 'callback'),      //电话号码格式验证
        array('mobile', '', -7, self::EXISTS_VALIDATE, 'unique'),                   //电话号码已存在
    );
    //自动完成
    protected $_auto = array(
        array('password', 'md5', self::MODEL_BOTH, 'function') ,                    // 使用md5函数处理password
        array('reg_time', NOW_TIME, self::MODEL_INSERT),
        array('last_login_time', NOW_TIME, self::MODEL_INSERT),
    );
    //用户注册
    public function register($username, $password, $mobile){
        //随机获取头像和背景图
        $avatar = C('DEFAULT_AVATAR') . 'avatar(' . rand(1, 8) . ').jpg';
        $bg = C('DEFAULT_BACKGROUND') . 'bg(' . rand(1, 21) . ').jpg';
        
        $data = array('username'=>$username, 'nickname' => $username, 'password'=>$password, 'mobile' => $mobile, 'avatar_url' => $avatar, 'cover_img' => $bg);
        if($user = $this->create($data)){
            $id = $this->add($user);
            if(!$id){
                return -8;
            }
//            $user = array("username" => $username, "nickname" => $username, "id" => $id);
//            $this->saveLogin($user, 0);
        }else{
            return $this->getError();
        }
        return $id;
    }
    /**
     * 用户登录
     * @param type $username 用户名
     * @param type $password 密码
     * @return type
     */
    public function login($username, $password){
        
        $user = $this->field('id, username, password')->where(array("username" => $username))->find();
        if($user){
            if(md5($password) == $user['password']){
                $this->saveLogin($user, $remember);
                M('User')->save(array('id' => $user['id'], 'last_login_time' => NOW_TIME));
                return $user['id'];
            }
            return -2;  //用户名密码不匹配
        }else{
            return -1;  //用户名不存在
        }
    }
    /**
     * 自动验证用户名是否合法
     * @param type $username 用户名
     * @return boolean
     */
    public function checkUserName($username){
        
        // 如果用户名中有空格，不允许注册
        if (strpos($username, ' ') !== false) {
            return false;
        }
        // 只允许用户输入中文，英文，数字，下划线，空格  看不懂。。。。
        preg_match('/^(?!_|\s\')[A-Za-z0-9_\x80-\xff\s\']+$/', $username, $result);
        if (!$result) {
            return false;
        }
        return true;
    }
    /**
     * 自动验证手机号码格式
     * @param type $mobile 手机号
     * @return boolean
     */
    public function checkMobile($mobile){
        if (strpos($mobile, ' ') !== false) {
            return false;
        }
        //手机号格式验证
        preg_match('/^1[3|4|5|8][0-9]\d{4,8}$/', $mobile, $result);
        if (!$result) {
            return false;
        }
        return true;        
    }

    /**
     * session保存用户登录信息，可记住密码
     * @param type $user      用户信息
     * @param type $remember  是否记住密码
     */
    public function saveLogin($user, $remember){
        
        //session
        $userinfo = array('id' => $user['id'],
                         'username' => $user['username']);
        session("userinfo",$userinfo);
        
        $remember = 1;
        //记住密码
        if(!$this->getCookieUid() && $remember){
            $expire = 3600 * 24;
            cookie('LOGGED_USER', $this->encode($user['id'].".".time()), $expire);
        }
    }
    
    /**
     * 加密函数
     * @param string $txt 需加密的字符串
     * @param string $key 加密密钥，默认读取SECURE_CODE配置
     * @return string 加密后的字符串
     */
    private function encode($txt, $key = null)
    {
        
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-=_";
        $nh = rand(0, 64);
        $ch = $chars[$nh];
        $mdKey = md5($key . $ch);
        $mdKey = substr($mdKey, $nh % 8, $nh % 8 + 7);
        $txt = base64_encode($txt);
        $tmp = '';
        $i = 0;
        $j = 0;
        $k = 0;
        for ($i = 0; $i < strlen($txt); $i++) {
            $k = $k == strlen($mdKey) ? 0 : $k;
            $j = ($nh + strpos($chars, $txt [$i]) + ord($mdKey[$k++])) % 64;
            $tmp .= $chars[$j];
        }
        return $ch . $tmp;
    }

    /**
     * 解密函数
     * @param string $txt 待解密的字符串
     * @param string $key 解密密钥，默认读取SECURE_CODE配置
     * @return string 解密后的字符串
     */
    private function decode($txt, $key = null)
    {

        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-=_";
        $ch = $txt[0];
        $nh = strpos($chars, $ch);
        $mdKey = md5($key . $ch);
        $mdKey = substr($mdKey, $nh % 8, $nh % 8 + 7);
        $txt = substr($txt, 1);
        $tmp = '';
        $i = 0;
        $j = 0;
        $k = 0;
        for ($i = 0; $i < strlen($txt); $i++) {
            $k = $k == strlen($mdKey) ? 0 : $k;
            $j = strpos($chars, $txt[$i]) - $nh - ord($mdKey[$k++]);
            while ($j < 0) {
                $j += 64;
            }
            $tmp .= $chars[$j];
        }

        return base64_decode($tmp);
    }
    //判断是否需要登录（有记住密码功能）
    public function need_login()
    {
        if ($id = $this->getCookieUid()) {
//            $this->login($id);//TODO,这里需要修改。。。。直接删除？
            return true;
        }
    }
    
    public function getCookieUid(){
        static $cookie_id = null;
        if (isset($cookie_id) && $cookie_id !== null) {
            return $cookie_id;
        }
        $cookie = cookie('LOGGED_USER');
        $cookie = explode(".", $this->decode($cookie));
        $cookie_id = $cookie[0];
        return $cookie_id;
    }
}